home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
games
/
hitton
/
htn_src.lzh
/
HTN_SRC
/
HTN_GRAP.C
< prev
next >
Wrap
Text File
|
2000-07-03
|
5KB
|
236 lines
/* 『ひっとん』 ver.1.00 描画関係 (HTN_GRAP.C) 2000 TAU Software */
# include "HTN_DEF.H"
/****** グラフィック画面 ********************************************/
/*** グラフィックのGET&PUT ***/
/* [返り値] 0:正常終了 1:エラー */
int GRM_GP(x,y,xl,yl,adr,gp)
int x,y; /* 始点座標 */
int xl,yl; /* 終点までの距離 */
unsigned char *adr; /* データの始点アドレス */
int gp; /* 1:GET 0:PUT */
{
# ifdef __GNUC__
struct GETPTR gpp={x,y,x+xl-1,y+yl-1,adr,adr+xl*yl-1};
# else
struct GETPTR gpp; /* XC用 */
gpp.x1=x; gpp.y1=y;
gpp.x2=x+xl-1; gpp.y2=y+yl-1;
gpp.buf_start=adr;
gpp.buf_end=adr+xl*yl-1;
# endif
int (*GET_or_PUT[2])()={ PUTGRM, GETGRM };
return (*(GET_or_PUT+gp))(&gpp);
}
/*** グラフィックフィル ***/
/* [返り値] 0:正常終了 1:エラー */
int FILL0(x,y,xl,yl,cl)
int x,y; /* 始点座標 */
int xl,yl; /* 終点までの距離 */
unsigned short int cl; /* ページ */
{
# ifdef __GNUC__
struct FILLPTR fpp={x,y,x+xl-1,y+yl-1,cl};
# else
struct FILLPTR fpp; /* XC用 */
fpp.x1=x1; fpp.y1=y1;
fpp.x2=x2; fpp.y2=y2;
fpp.color=cl;
# endif
return FILL(&fpp);
}
/****** テキスト画面 ************************************************/
/*** テキストフィル ****/
/* [返り値] 無し */
void TXFILL0(x,y,xl,yl,pg,ptn)
int x,y; /* 始点座標 */
int xl,yl; /* 終点までの距離 */
int pg; /* テキストプレーン ( 0-3bit が、各プレーンに対応 ) */
unsigned short int ptn; /* フィルパターン */
{
unsigned short int mem; /* テキスト・アクセス・セット記録用 */
# ifdef __GNUC__
struct TXFILLPTR tfp={0,x,y,xl,yl,ptn};
# else
struct TXFILLPTR tfp={0}; /* XC用 */
tfp.x=x; tfp.y=y;
tfp.x1=xl; tfp.y1=yl;
tfp.fill_patn=ptn;
# endif
if(pg>=0 && pg<16){
mem=B_WPEEK((unsigned short int *)0xE8002A);
B_WPOKE((unsigned short int *)0xE8002A,0x100|(pg<<4)); /* テキスト同時アクセス */
TXFILL(&tfp);
B_WPOKE((unsigned short int *)0xE8002A,mem);
}
}
/*** メッセージ表示 ****/
/* [返り値] 無し */
void PRINT_MES(x,y,mes,cl)
int x,y; /* 表示位置 */
char *mes; /* メッセージ */
int cl; /* 色 */
{
int i,no;
unsigned char moji[]="アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨ゙゚ラリルレロワヲンー!ャュョッ ";
while(*mes != '\0'){
TXFILL0(x,y,18,18,15,0);
if((no=strchr(moji,*mes)) != NULL) no-=(int)moji; else no=54;
if(no != 54){
TCOLOR(1); TEXTPUT(x,y,(struct FNTBUF *)(LTRS(no,0)));
for(i=1;i<=3;i++){
if(cl & (1<<(i-1))){
TCOLOR(1<<i);
TEXTPUT(x,y,(struct FNTBUF *)(LTRS(no,1)));
}
}
}
x+=18;
mes++;
}
}
/*** 数字列表示 ****/
/* [返り値] 無し */
void PRINT_TXNUM(x,y,num,zero,fig,cl)
int x,y; /* 表示位置 */
int num,zero,fig; /* 数字、0詰め、桁数 */
int cl; /* 色 */
{
int i,pn,no=1;
char buf[10],*buf0=buf; /* 文字格納 */
unsigned char dt0[38]={0,10,0,17},dt1[38]={0,10,0,17}; /* パターン作成用 */
sprintf(buf,"%*d",fig,num); /* 数字 -> 文字 */
while(*buf0 != '\0'){
TXFILL0(x,y,10,17,15,0);
if(zero==0 && *buf0==' ') *buf0='0';
if(*buf0 != ' '){
pn=no;
no=*buf0-'0';
for(i=0;i<34;i++){
*(dt0+i+4)=*(NUMS(no,0)+i) | (*(NSUB(pn)+i/2))*(1-(i&1));
*(dt1+i+4)=*(NUMS(no,1)+i);
}
TCOLOR(1); TEXTPUT(x,y,(struct FNTBUF *)dt0);
for(i=1;i<=3;i++){
if(cl & (1<<(i-1))){
TCOLOR(1<<i);
TEXTPUT(x,y,(struct FNTBUF *)dt1);
}
}
}
x+=9;
buf0++;
}
}
/****** スプライト画面 **********************************************/
/*** 数字表示 ***/
/* [返り値] 無し */
void PRINT_SPNUM(sn,x,y,num,zero,fig,pb)
int sn; /* 最初のスプライト番号 */
int x,y; /* 表示位置 */
int num,zero,fig; /* 数字、0詰め、桁数 */
int pb; /* パレットブロック */
{
int z; /* 雑用 */
char buf[10],*buf0=buf; /* 文字格納 */
sprintf(buf,"%*d",fig,num); /* 数字 -> 文字 */
while(*buf0 != '\0'){
if(zero) z=256; else z=pb*256+55;
if(*buf0 != ' ') z=pb*256+(*buf0)+7;
SP_REGST0(sn,x,y,z);
sn++;
x+=9;
buf0++;
}
}
/*** sprite ***/
void SP_REGST0(sn,x,y,pt)
int sn,x,y,pt;
{
B_WPOKE((unsigned short *)(0xEB0000+sn*8),x+16);
B_WPOKE((unsigned short *)(0xEB0002+sn*8),y+16);
B_WPOKE((unsigned short *)(0xEB0004+sn*8),pt);
B_WPOKE((unsigned short *)(0xEB0006+sn*8),1);
}
void SET_SP_BLOCK(sn,x0,y0,kd,cn)
int sn; /* スプライト面番号 */
int x0,y0; /* 表示位置 */
int kd,cn; /* ブロックの種類、連結パターン */
{
int pt;
pt=kd*258+cn*12+257;
B_WPOKE((unsigned short *)(0xEB0000+sn*8),x0+16);
B_WPOKE((unsigned short *)(0xEB0002+sn*8),y0+16);
B_WPOKE((unsigned short *)(0xEB0004+sn*8),pt);
B_WPOKE((unsigned short *)(0xEB0006+sn*8),1);
B_WPOKE((unsigned short *)(0xEB0000+sn*8+8),x0+16);
B_WPOKE((unsigned short *)(0xEB0002+sn*8+8),y0+32);
B_WPOKE((unsigned short *)(0xEB0004+sn*8+8),pt+1);
B_WPOKE((unsigned short *)(0xEB0006+sn*8+8),1);
}
/*** BG ***/
/* [返り値] 無し */
void SET_BG_BLOCK(pl,xp,kd,cn)
int pl; /* プレイヤー番号 */
int xp; /* 表示位置 */
int kd,cn; /* ブロックの種類、連結パターン */
{
int z=0;
xp=63-xp*2;
if(kd != -1) z=kd*264+cn*48+260;
BGTEXTST(pl,xp ,32,z);
BGTEXTST(pl,xp+1,32,z+(kd!=-1)*2);
BGTEXTST(pl,xp ,33,z+(kd!=-1)*1);
BGTEXTST(pl,xp+1,33,z+(kd!=-1)*3);
BGTEXTST(pl,xp ,34,z+(kd!=-1)*4);
BGTEXTST(pl,xp+1,34,z+(kd!=-1)*6);
}